package com.gz.moreaseManager.core.base;

import com.gz.moreaseManager.utils.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.TimeUnit;

/**
 * RediCache 工具类
 */
@Component
public class RedisSupport {

	private StringRedisTemplate redisTemplate;

	@Autowired
	public void setRedisTemplate(StringRedisTemplate redisTemplate) {
		this.redisTemplate = redisTemplate;
	}

	/**
	 * 判断Key是否存在
	 *
	 * @param key 缓存的Key
	 * @return 缓存的Key是否存在
	 */
	public Boolean hasKey(String key) {
		return redisTemplate.hasKey(key);
	}

	/**
	 * 获取所有Key
	 *
	 * @param pattern 匹配规则
	 * @return 所有Key集合
	 */
	public Collection<String> keys(String pattern) {
		return redisTemplate.keys(pattern);
	}

	/**
	 * 删除缓存
	 *
	 * @param key 缓存的Key
	 */
	public void delete(String... key) {
		if (key != null && key.length > 0) {
			if (key.length == 1)
				redisTemplate.delete(key[0]);
			else
				redisTemplate.delete(Arrays.asList(key));
		}
	}

	/**
	 * 获取缓存值
	 *
	 * @param key 缓存的Key
	 * @return 缓存值
	 */
	public String get(String key) {
		return key == null ? null : redisTemplate.opsForValue().get(key);
	}

	/**
	 * 获取缓存值
	 *
	 * @param key   缓存的Key
	 * @param clazz 转换对象类
	 * @param <T>   泛型对象
	 * @return 数据对象
	 */
	public <T> T get(String key, Class<T> clazz) {
		if (key == null) return null;
		String value = redisTemplate.opsForValue().get(key);
		if (value != null)
			return JsonUtil.toObject(value, clazz);
		return null;
	}

	/**
	 * 添加缓存
	 *
	 * @param key 缓存的Key
	 * @param obj 缓存的对象
	 */
	public void set(String key, Object obj) {
		if (key == null || obj == null) return;
		String value = obj instanceof String ? (String) obj : JsonUtil.toJson(obj);
		redisTemplate.opsForValue().set(key, value);
	}

	/**
	 * 指定缓存失效时间
	 *
	 * @param key  缓存的Key
	 * @param time 超时时间
	 * @param unit 时间单位
	 */
	public void expire(String key, long time, TimeUnit unit) {
		if (time > 0)
			redisTemplate.expire(key, time, unit);
	}

	/**
	 * 添加超时的缓存
	 *
	 * @param key  缓存的Key
	 * @param obj  缓存的对象
	 * @param time 超时时间
	 * @param unit 时间单位
	 */
	public void set(String key, Object obj, long time, TimeUnit unit) {
		if (obj == null)
			return;
		String value = obj instanceof String ? (String) obj : JsonUtil.toJson(obj);
		if (time > 0)
			redisTemplate.opsForValue().set(key, value, time, unit);
		else
			redisTemplate.opsForValue().set(key, value);
	}

	/**
	 * 根据Key获取过期时间
	 *
	 * @param key  缓存的Key
	 * @param unit 时间单位
	 * @return 超时时间(0为永久有效)
	 */
	public Long getExpire(String key, TimeUnit unit) {
		return redisTemplate.getExpire(key, unit);
	}
}